{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5461a818",
   "metadata": {},
   "source": [
    "[![Dataflowr](https://raw.githubusercontent.com/dataflowr/website/master/_assets/dataflowr_logo.png)](https://dataflowr.github.io/website/)\n",
    "\n",
    "Make sure you are familiar with the material of [Module 2a - Pytorch tensors](https://dataflowr.github.io/website/modules/2a-pytorch-tensors/) and [Module 2b - Automatic differentiation](https://dataflowr.github.io/website/modules/2b-automatic-differentiation/) before starting this homework."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b8ed2a1",
   "metadata": {},
   "source": [
    "# Homewrok 1: MLP from scratch (solution)\n",
    "\n",
    "In this homework, you will code a [Multilayer perceptron](https://en.wikipedia.org/wiki/Multilayer_perceptron) with one hidden layer to classify cloud of points in 2D.\n",
    "\n",
    "Advice:\n",
    "- As much as possible, please try to make matrix and vector operations (good practice for efficient code)\n",
    "- If you're not familiar with numpy, check the documentation of `np.max`, `np.clip`, `np.random.randn`, `np.reshape`. FYI the matrix multiplication operator is `@`, and you may want to learn about [broadcasting rules](https://numpy.org/doc/stable/user/basics.broadcasting.html) to see how it deals with tensor operations of different sizes\n",
    "- You can also check about `torch.clamp`, `torch.nn.Parameter`\n",
    "\n",
    "## 1. Some utilities and your dataset\n",
    "\n",
    "You should not modify the code in this section"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a72dc18c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# all of these libraries are used for plotting\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Plot the dataset\n",
    "def plot_data(ax, X, Y):\n",
    "    plt.axis('off')\n",
    "    ax.scatter(X[:, 0], X[:, 1], s=1, c=Y, cmap='bone')\n",
    "\n",
    "from sklearn.datasets import make_moons\n",
    "X, Y = make_moons(n_samples=2000, noise=0.1)\n",
    "\n",
    "%matplotlib inline\n",
    "x_min, x_max = -1.5, 2.5\n",
    "y_min, y_max = -1, 1.5\n",
    "fig, ax = plt.subplots(1, 1, facecolor='#4B6EA9')\n",
    "ax.set_xlim(x_min, x_max)\n",
    "ax.set_ylim(y_min, y_max)\n",
    "plot_data(ax, X, Y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8685399b",
   "metadata": {},
   "source": [
    "This is your dataset: two moons each one corresponding to one class (black or white in the picture above).\n",
    "\n",
    "In order to make it more fun and illustrative, the code below allows you to see the decision boundary of your classifier. Unfortunately, animation is not working on colab..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a897bcfd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define the grid on which we will evaluate our classifier\n",
    "xx, yy = np.meshgrid(np.arange(x_min, x_max, .1),\n",
    "                     np.arange(y_min, y_max, .1))\n",
    "\n",
    "to_forward = np.array(list(zip(xx.ravel(), yy.ravel())))\n",
    "\n",
    "# plot the decision boundary of our classifier\n",
    "def plot_decision_boundary(ax, X, Y, classifier):\n",
    "    # forward pass on the grid, then convert to numpy for plotting\n",
    "    Z = classifier.forward(to_forward)\n",
    "    Z = Z.reshape(xx.shape)\n",
    "    \n",
    "    # plot contour lines of the values of our classifier on the grid\n",
    "    ax.contourf(xx, yy, Z>0.5, cmap='Blues')\n",
    "    \n",
    "    # then plot the dataset\n",
    "    plot_data(ax, X,Y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94c47efa",
   "metadata": {},
   "source": [
    "## 2. MLP in numpy\n",
    "\n",
    "Here you need to code your implementation of the [ReLU](https://en.wikipedia.org/wiki/Rectifier_(neural_networks) activation and the [Sigmoid](https://en.wikipedia.org/wiki/Sigmoid_function)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d85e14ea",
   "metadata": {},
   "outputs": [],
   "source": [
    "class MyReLU(object):\n",
    "    def forward(self, x):\n",
    "        # the relu is y_i = max(0, x_i)\n",
    "        self.save_for_backward = (x > 0).astype('float')\n",
    "        return self.save_for_backward * x\n",
    "        \n",
    "    \n",
    "    def backward(self, grad_output):\n",
    "        # the gradient is 1 for the inputs that were above 0, 0 elsewhere\n",
    "        self.grad = self.save_for_backward * grad_output\n",
    "        return self.grad\n",
    "    \n",
    "    def step(self, learning_rate):\n",
    "        # no need to do anything here, since ReLU has no parameters\n",
    "        pass\n",
    "\n",
    "class MySigmoid(object):\n",
    "    def forward(self, x):\n",
    "        # the sigmoid is y_i = 1./(1+exp(-x_i))\n",
    "        self.save_for_backward = np.exp(-x)\n",
    "        return 1. / (1 + self.save_for_backward)\n",
    "    \n",
    "    def backward(self, grad_output):\n",
    "        # the partial derivative is e^-x / (e^-x + 1)^2\n",
    "        self.grad = (grad_output * self.save_for_backward) / (self.save_for_backward + 1) ** 2\n",
    "        return self.grad\n",
    "    \n",
    "    def step(self, learning_rate):\n",
    "        # no need to do anything here since Sigmoid has no parameters\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c790c022",
   "metadata": {},
   "source": [
    "Probably a good time to test your functions..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9ab05951",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.76919449, 0.47145964])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_relu = MyReLU()\n",
    "test_relu.forward(X[10])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ca26d423",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1., 1.])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_relu.backward(np.ones(1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "988432fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.73105858])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_sig = MySigmoid()\n",
    "\n",
    "test_sig.forward(np.ones(1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "44234fdc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.19661193])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_sig.backward(np.ones(1))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43b8561c",
   "metadata": {},
   "source": [
    "A bit more complicated, you need now to implement your linear layer i.e. multiplication by a matrix W and summing with a bias b."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3457d41b",
   "metadata": {},
   "outputs": [],
   "source": [
    "class MyLinear(object):\n",
    "    def __init__(self, n_input, n_output):\n",
    "        # initialize two random matrices for W and b (use np.random.randn)\n",
    "        self.W = np.random.randn(n_input, n_output)\n",
    "        self.b = np.random.randn(1,n_output)\n",
    "\n",
    "    def forward(self, x):\n",
    "        # save a copy of x, you'll need it for the backward\n",
    "        # return xW + b\n",
    "        self.saved_for_backward = x.copy()\n",
    "        return x @ self.W + self.b\n",
    "\n",
    "    def backward(self, grad_output):\n",
    "        # y_i = \\sum_j x_jW_{j,i} + b_i\n",
    "        # d y_i / d W_{j, i} = x_j\n",
    "        # d loss / d y_i = grad_output[i]\n",
    "        # so d loss / d W_{j,i} = x_j * grad_output[i]  (by the chain rule)\n",
    "        self.grad_W = (grad_output.T @ self.saved_for_backward).T\n",
    "    \n",
    "        # d y_i / d b_i = 1\n",
    "        # d loss / d y_i = grad_output[i]\n",
    "        self.grad_b = grad_output.copy()\n",
    "        \n",
    "        # now we need to compute the gradient with respect to x to continue the back propagation\n",
    "        # d y_i / d x_j = W_{j, i}\n",
    "        # to compute the gradient of the loss, we have to sum over all possible y_i in the chain rule\n",
    "        # d loss / d x_j = \\sum_i (d loss / d y_i) (d y_i / d x_j)\n",
    "        return grad_output @ self.W.T\n",
    "    \n",
    "    def step(self, learning_rate):\n",
    "        # update self.W and self.b in the opposite direction of the stored gradients, for learning_rate\n",
    "        self.W -= learning_rate * self.grad_W\n",
    "        self.b -= learning_rate * self.grad_b\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c265a80d",
   "metadata": {},
   "source": [
    "As we did in practicals, you need now to code your network (what we called my_composition in the [practicals](https://github.com/dataflowr/notebooks/blob/master/Module2/02_backprop.ipynb)). Recall with a Sigmoid layer, you should use the BCE loss."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4da1ba99",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Sequential(object):\n",
    "    def __init__(self, layers):\n",
    "        self.layers = layers\n",
    "        \n",
    "    def forward(self, x):\n",
    "        for layer in self.layers:\n",
    "            x = layer.forward(x)\n",
    "        return x\n",
    "    \n",
    "    def compute_loss(self, out, label):\n",
    "        # use the BCE loss\n",
    "        # -(label * log(output) + (1-label) * log(1-output))\n",
    "        # save the gradient, and return the loss      \n",
    "        # beware of dividing by zero in the gradient.\n",
    "        # split the computation in two cases, one where the label is 0 and another one where the label is 1\n",
    "        # add a small value (1e-10) to the denominator\n",
    "        self.loss = - (label * np.log(out) + (1-label) * np.log(1-out))\n",
    "        if label == 0:\n",
    "            self.loss_grad =  (1-label) / (1-out + 1e-10)\n",
    "        else:\n",
    "            self.loss_grad = - label / (out + 1e-10)\n",
    "        \n",
    "        return self.loss\n",
    "\n",
    "    def backward(self):\n",
    "        # apply backprop sequentially, starting from the gradient of the loss\n",
    "        current_grad = self.loss_grad\n",
    "        for layer in reversed(self.layers):\n",
    "            current_grad = layer.backward(current_grad)\n",
    "    \n",
    "    def step(self, learning_rate):\n",
    "        # take a gradient step for each layers\n",
    "        for layer in self.layers:\n",
    "            layer.step(learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "078008a9",
   "metadata": {},
   "outputs": [],
   "source": [
    "h=50\n",
    "\n",
    "# define your network with your Sequential\n",
    "# it should be a linear layer with 2 inputs and h outputs, followed by a ReLU\n",
    "# then a linear layer with h inputs and 1 outputs, followed by a sigmoid\n",
    "# feel free to try other architectures\n",
    "\n",
    "net =  Sequential([\n",
    "    MyLinear(2, h),\n",
    "    MyReLU(),\n",
    "    MyLinear(h, 1),\n",
    "    MySigmoid()\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1eabc519",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "/* global mpl */\n",
       "window.mpl = {};\n",
       "\n",
       "mpl.get_websocket_type = function () {\n",
       "    if (typeof WebSocket !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof MozWebSocket !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert(\n",
       "            'Your browser does not have WebSocket support. ' +\n",
       "                'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "                'Firefox 4 and 5 are also supported but you ' +\n",
       "                'have to enable WebSockets in about:config.'\n",
       "        );\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = this.ws.binaryType !== undefined;\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById('mpl-warnings');\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent =\n",
       "                'This browser does not support binary websocket messages. ' +\n",
       "                'Performance may be slow.';\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = document.createElement('div');\n",
       "    this.root.setAttribute('style', 'display: inline-block');\n",
       "    this._root_extra_style(this.root);\n",
       "\n",
       "    parent_element.appendChild(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen = function () {\n",
       "        fig.send_message('supports_binary', { value: fig.supports_binary });\n",
       "        fig.send_message('send_image_mode', {});\n",
       "        if (fig.ratio !== 1) {\n",
       "            fig.send_message('set_device_pixel_ratio', {\n",
       "                device_pixel_ratio: fig.ratio,\n",
       "            });\n",
       "        }\n",
       "        fig.send_message('refresh', {});\n",
       "    };\n",
       "\n",
       "    this.imageObj.onload = function () {\n",
       "        if (fig.image_mode === 'full') {\n",
       "            // Full images could contain transparency (where diff images\n",
       "            // almost always do), so we need to clear the canvas so that\n",
       "            // there is no ghosting.\n",
       "            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "        }\n",
       "        fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "    };\n",
       "\n",
       "    this.imageObj.onunload = function () {\n",
       "        fig.ws.close();\n",
       "    };\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_header = function () {\n",
       "    var titlebar = document.createElement('div');\n",
       "    titlebar.classList =\n",
       "        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
       "    var titletext = document.createElement('div');\n",
       "    titletext.classList = 'ui-dialog-title';\n",
       "    titletext.setAttribute(\n",
       "        'style',\n",
       "        'width: 100%; text-align: center; padding: 3px;'\n",
       "    );\n",
       "    titlebar.appendChild(titletext);\n",
       "    this.root.appendChild(titlebar);\n",
       "    this.header = titletext;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = (this.canvas_div = document.createElement('div'));\n",
       "    canvas_div.setAttribute('tabindex', '0');\n",
       "    canvas_div.setAttribute(\n",
       "        'style',\n",
       "        'border: 1px solid #ddd;' +\n",
       "            'box-sizing: content-box;' +\n",
       "            'clear: both;' +\n",
       "            'min-height: 1px;' +\n",
       "            'min-width: 1px;' +\n",
       "            'outline: 0;' +\n",
       "            'overflow: hidden;' +\n",
       "            'position: relative;' +\n",
       "            'resize: both;' +\n",
       "            'z-index: 2;'\n",
       "    );\n",
       "\n",
       "    function on_keyboard_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.key_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'keydown',\n",
       "        on_keyboard_event_closure('key_press')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'keyup',\n",
       "        on_keyboard_event_closure('key_release')\n",
       "    );\n",
       "\n",
       "    this._canvas_extra_style(canvas_div);\n",
       "    this.root.appendChild(canvas_div);\n",
       "\n",
       "    var canvas = (this.canvas = document.createElement('canvas'));\n",
       "    canvas.classList.add('mpl-canvas');\n",
       "    canvas.setAttribute(\n",
       "        'style',\n",
       "        'box-sizing: content-box;' +\n",
       "            'pointer-events: none;' +\n",
       "            'position: relative;' +\n",
       "            'z-index: 0;'\n",
       "    );\n",
       "\n",
       "    this.context = canvas.getContext('2d');\n",
       "\n",
       "    var backingStore =\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        this.context.webkitBackingStorePixelRatio ||\n",
       "        this.context.mozBackingStorePixelRatio ||\n",
       "        this.context.msBackingStorePixelRatio ||\n",
       "        this.context.oBackingStorePixelRatio ||\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        1;\n",
       "\n",
       "    this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
       "        'canvas'\n",
       "    ));\n",
       "    rubberband_canvas.setAttribute(\n",
       "        'style',\n",
       "        'box-sizing: content-box;' +\n",
       "            'left: 0;' +\n",
       "            'pointer-events: none;' +\n",
       "            'position: absolute;' +\n",
       "            'top: 0;' +\n",
       "            'z-index: 1;'\n",
       "    );\n",
       "\n",
       "    // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
       "    if (this.ResizeObserver === undefined) {\n",
       "        if (window.ResizeObserver !== undefined) {\n",
       "            this.ResizeObserver = window.ResizeObserver;\n",
       "        } else {\n",
       "            var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
       "            this.ResizeObserver = obs.ResizeObserver;\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
       "        var nentries = entries.length;\n",
       "        for (var i = 0; i < nentries; i++) {\n",
       "            var entry = entries[i];\n",
       "            var width, height;\n",
       "            if (entry.contentBoxSize) {\n",
       "                if (entry.contentBoxSize instanceof Array) {\n",
       "                    // Chrome 84 implements new version of spec.\n",
       "                    width = entry.contentBoxSize[0].inlineSize;\n",
       "                    height = entry.contentBoxSize[0].blockSize;\n",
       "                } else {\n",
       "                    // Firefox implements old version of spec.\n",
       "                    width = entry.contentBoxSize.inlineSize;\n",
       "                    height = entry.contentBoxSize.blockSize;\n",
       "                }\n",
       "            } else {\n",
       "                // Chrome <84 implements even older version of spec.\n",
       "                width = entry.contentRect.width;\n",
       "                height = entry.contentRect.height;\n",
       "            }\n",
       "\n",
       "            // Keep the size of the canvas and rubber band canvas in sync with\n",
       "            // the canvas container.\n",
       "            if (entry.devicePixelContentBoxSize) {\n",
       "                // Chrome 84 implements new version of spec.\n",
       "                canvas.setAttribute(\n",
       "                    'width',\n",
       "                    entry.devicePixelContentBoxSize[0].inlineSize\n",
       "                );\n",
       "                canvas.setAttribute(\n",
       "                    'height',\n",
       "                    entry.devicePixelContentBoxSize[0].blockSize\n",
       "                );\n",
       "            } else {\n",
       "                canvas.setAttribute('width', width * fig.ratio);\n",
       "                canvas.setAttribute('height', height * fig.ratio);\n",
       "            }\n",
       "            /* This rescales the canvas back to display pixels, so that it\n",
       "             * appears correct on HiDPI screens. */\n",
       "            canvas.style.width = width + 'px';\n",
       "            canvas.style.height = height + 'px';\n",
       "\n",
       "            rubberband_canvas.setAttribute('width', width);\n",
       "            rubberband_canvas.setAttribute('height', height);\n",
       "\n",
       "            // And update the size in Python. We ignore the initial 0/0 size\n",
       "            // that occurs as the element is placed into the DOM, which should\n",
       "            // otherwise not happen due to the minimum size styling.\n",
       "            if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
       "                fig.request_resize(width, height);\n",
       "            }\n",
       "        }\n",
       "    });\n",
       "    this.resizeObserverInstance.observe(canvas_div);\n",
       "\n",
       "    function on_mouse_event_closure(name) {\n",
       "        /* User Agent sniffing is bad, but WebKit is busted:\n",
       "         * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
       "         * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
       "         * The worst that happens here is that they get an extra browser\n",
       "         * selection when dragging, if this check fails to catch them.\n",
       "         */\n",
       "        var UA = navigator.userAgent;\n",
       "        var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
       "        if(isWebKit) {\n",
       "            return function (event) {\n",
       "                /* This prevents the web browser from automatically changing to\n",
       "                 * the text insertion cursor when the button is pressed. We\n",
       "                 * want to control all of the cursor setting manually through\n",
       "                 * the 'cursor' event from matplotlib */\n",
       "                event.preventDefault()\n",
       "                return fig.mouse_event(event, name);\n",
       "            };\n",
       "        } else {\n",
       "            return function (event) {\n",
       "                return fig.mouse_event(event, name);\n",
       "            };\n",
       "        }\n",
       "    }\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'mousedown',\n",
       "        on_mouse_event_closure('button_press')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'mouseup',\n",
       "        on_mouse_event_closure('button_release')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'dblclick',\n",
       "        on_mouse_event_closure('dblclick')\n",
       "    );\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    canvas_div.addEventListener(\n",
       "        'mousemove',\n",
       "        on_mouse_event_closure('motion_notify')\n",
       "    );\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'mouseenter',\n",
       "        on_mouse_event_closure('figure_enter')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'mouseleave',\n",
       "        on_mouse_event_closure('figure_leave')\n",
       "    );\n",
       "\n",
       "    canvas_div.addEventListener('wheel', function (event) {\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        on_mouse_event_closure('scroll')(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.appendChild(canvas);\n",
       "    canvas_div.appendChild(rubberband_canvas);\n",
       "\n",
       "    this.rubberband_context = rubberband_canvas.getContext('2d');\n",
       "    this.rubberband_context.strokeStyle = '#000000';\n",
       "\n",
       "    this._resize_canvas = function (width, height, forward) {\n",
       "        if (forward) {\n",
       "            canvas_div.style.width = width + 'px';\n",
       "            canvas_div.style.height = height + 'px';\n",
       "        }\n",
       "    };\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    canvas_div.addEventListener('contextmenu', function (_e) {\n",
       "        event.preventDefault();\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus() {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'mpl-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'mpl-button-group';\n",
       "    for (var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'mpl-button-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        var button = (fig.buttons[name] = document.createElement('button'));\n",
       "        button.classList = 'mpl-widget';\n",
       "        button.setAttribute('role', 'button');\n",
       "        button.setAttribute('aria-disabled', 'false');\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "\n",
       "        var icon_img = document.createElement('img');\n",
       "        icon_img.src = '_images/' + image + '.png';\n",
       "        icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
       "        icon_img.alt = tooltip;\n",
       "        button.appendChild(icon_img);\n",
       "\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    var fmt_picker = document.createElement('select');\n",
       "    fmt_picker.classList = 'mpl-widget';\n",
       "    toolbar.appendChild(fmt_picker);\n",
       "    this.format_dropdown = fmt_picker;\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = document.createElement('option');\n",
       "        option.selected = fmt === mpl.default_extension;\n",
       "        option.innerHTML = fmt;\n",
       "        fmt_picker.appendChild(option);\n",
       "    }\n",
       "\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.send_message = function (type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function () {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1], msg['forward']);\n",
       "        fig.send_message('refresh', {});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
       "    var x0 = msg['x0'] / fig.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
       "    var x1 = msg['x1'] / fig.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0,\n",
       "        0,\n",
       "        fig.canvas.width / fig.ratio,\n",
       "        fig.canvas.height / fig.ratio\n",
       "    );\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
       "    fig.canvas_div.style.cursor = msg['cursor'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
       "    for (var key in msg) {\n",
       "        if (!(key in fig.buttons)) {\n",
       "            continue;\n",
       "        }\n",
       "        fig.buttons[key].disabled = !msg[key];\n",
       "        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
       "    if (msg['mode'] === 'PAN') {\n",
       "        fig.buttons['Pan'].classList.add('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    } else if (msg['mode'] === 'ZOOM') {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.add('active');\n",
       "    } else {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function () {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message('ack', {});\n",
       "};\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            var img = evt.data;\n",
       "            if (img.type !== 'image/png') {\n",
       "                /* FIXME: We get \"Resource interpreted as Image but\n",
       "                 * transferred with MIME type text/plain:\" errors on\n",
       "                 * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "                 * to be part of the websocket stream */\n",
       "                img.type = 'image/png';\n",
       "            }\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src\n",
       "                );\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                img\n",
       "            );\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        } else if (\n",
       "            typeof evt.data === 'string' &&\n",
       "            evt.data.slice(0, 21) === 'data:image/png;base64'\n",
       "        ) {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig['handle_' + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\n",
       "                \"No handler for the '\" + msg_type + \"' message type: \",\n",
       "                msg\n",
       "            );\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\n",
       "                    \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
       "                    e,\n",
       "                    e.stack,\n",
       "                    msg\n",
       "                );\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "};\n",
       "\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * https://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys(original) {\n",
       "    return Object.keys(original).reduce(function (obj, key) {\n",
       "        if (typeof original[key] !== 'object') {\n",
       "            obj[key] = original[key];\n",
       "        }\n",
       "        return obj;\n",
       "    }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function (event, name) {\n",
       "    if (name === 'button_press') {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    // from https://stackoverflow.com/q/1114465\n",
       "    var boundingRect = this.canvas.getBoundingClientRect();\n",
       "    var x = (event.clientX - boundingRect.left) * this.ratio;\n",
       "    var y = (event.clientY - boundingRect.top) * this.ratio;\n",
       "\n",
       "    this.send_message(name, {\n",
       "        x: x,\n",
       "        y: y,\n",
       "        button: event.button,\n",
       "        step: event.step,\n",
       "        guiEvent: simpleKeys(event),\n",
       "    });\n",
       "\n",
       "    return false;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.key_event = function (event, name) {\n",
       "    // Prevent repeat events\n",
       "    if (name === 'key_press') {\n",
       "        if (event.key === this._key) {\n",
       "            return;\n",
       "        } else {\n",
       "            this._key = event.key;\n",
       "        }\n",
       "    }\n",
       "    if (name === 'key_release') {\n",
       "        this._key = null;\n",
       "    }\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.key !== 'Control') {\n",
       "        value += 'ctrl+';\n",
       "    }\n",
       "    else if (event.altKey && event.key !== 'Alt') {\n",
       "        value += 'alt+';\n",
       "    }\n",
       "    else if (event.shiftKey && event.key !== 'Shift') {\n",
       "        value += 'shift+';\n",
       "    }\n",
       "\n",
       "    value += 'k' + event.key;\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
       "    return false;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
       "    if (name === 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message('toolbar_button', { name: name });\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "\n",
       "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
       "// prettier-ignore\n",
       "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
       "\n",
       "mpl.default_extension = \"png\";/* global mpl */\n",
       "\n",
       "var comm_websocket_adapter = function (comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.binaryType = comm.kernel.ws.binaryType;\n",
       "    ws.readyState = comm.kernel.ws.readyState;\n",
       "    function updateReadyState(_event) {\n",
       "        if (comm.kernel.ws) {\n",
       "            ws.readyState = comm.kernel.ws.readyState;\n",
       "        } else {\n",
       "            ws.readyState = 3; // Closed state.\n",
       "        }\n",
       "    }\n",
       "    comm.kernel.ws.addEventListener('open', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('close', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('error', updateReadyState);\n",
       "\n",
       "    ws.close = function () {\n",
       "        comm.close();\n",
       "    };\n",
       "    ws.send = function (m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function (msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        var data = msg['content']['data'];\n",
       "        if (data['blob'] !== undefined) {\n",
       "            data = {\n",
       "                data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
       "            };\n",
       "        }\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(data);\n",
       "    });\n",
       "    return ws;\n",
       "};\n",
       "\n",
       "mpl.mpl_figure_comm = function (comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = document.getElementById(id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm);\n",
       "\n",
       "    function ondownload(figure, _format) {\n",
       "        window.open(figure.canvas.toDataURL());\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element;\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error('Failed to find cell for figure', id, fig);\n",
       "        return;\n",
       "    }\n",
       "    fig.cell_info[0].output_area.element.on(\n",
       "        'cleared',\n",
       "        { fig: fig },\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
       "    var width = fig.canvas.width / fig.ratio;\n",
       "    fig.cell_info[0].output_area.element.off(\n",
       "        'cleared',\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "    fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable();\n",
       "    fig.parent_element.innerHTML =\n",
       "        '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "    fig.close_ws(fig, msg);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width / this.ratio;\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] =\n",
       "        '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function () {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message('ack', {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () {\n",
       "        fig.push_to_output();\n",
       "    }, 1000);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'btn-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'btn-group';\n",
       "    var button;\n",
       "    for (var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'btn-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        button = fig.buttons[name] = document.createElement('button');\n",
       "        button.classList = 'btn btn-default';\n",
       "        button.href = '#';\n",
       "        button.title = name;\n",
       "        button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message pull-right';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = document.createElement('div');\n",
       "    buttongrp.classList = 'btn-group inline pull-right';\n",
       "    button = document.createElement('button');\n",
       "    button.classList = 'btn btn-mini btn-primary';\n",
       "    button.href = '#';\n",
       "    button.title = 'Stop Interaction';\n",
       "    button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
       "    button.addEventListener('click', function (_evt) {\n",
       "        fig.handle_close(fig, {});\n",
       "    });\n",
       "    button.addEventListener(\n",
       "        'mouseover',\n",
       "        on_mouseover_closure('Stop Interaction')\n",
       "    );\n",
       "    buttongrp.appendChild(button);\n",
       "    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
       "    titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
       "    var fig = event.data.fig;\n",
       "    if (event.target !== this) {\n",
       "        // Ignore bubbled events from children.\n",
       "        return;\n",
       "    }\n",
       "    fig.close_ws(fig, {});\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (el) {\n",
       "    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
       "    // this is important to make the div 'focusable\n",
       "    el.setAttribute('tabindex', 0);\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    } else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which === 13) {\n",
       "        this.canvas_div.blur();\n",
       "        // select the cell after this one\n",
       "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
       "        IPython.notebook.select(index + 1);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "};\n",
       "\n",
       "mpl.find_output_cell = function (html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i = 0; i < ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code') {\n",
       "            for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] === html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "};\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel !== null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target(\n",
       "        'matplotlib',\n",
       "        mpl.mpl_figure_comm\n",
       "    );\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"639.9999861283738\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# unfortunately animation is not working on colab\n",
    "# you should comment the following line if on colab\n",
    "%matplotlib notebook\n",
    "fig, ax = plt.subplots(1, 1, facecolor='#4B6EA9')\n",
    "ax.set_xlim(x_min, x_max)\n",
    "ax.set_ylim(y_min, y_max)\n",
    "losses = []\n",
    "learning_rate = 1e-2\n",
    "for it in range(10000):\n",
    "    # pick a random example id\n",
    "    j = np.random.randint(1, len(X))\n",
    "\n",
    "    # select the corresponding example and label\n",
    "    example = X[j:j+1]\n",
    "    label = Y[j]\n",
    "\n",
    "    # do a forward pass on the example\n",
    "    output = net.forward(example)\n",
    "\n",
    "    # compute the loss according to your output and the label\n",
    "    loss = net.compute_loss(output, label)\n",
    "    losses.append(loss.squeeze())\n",
    "    \n",
    "    # backward pass\n",
    "    net.backward()\n",
    "    \n",
    "    # gradient step\n",
    "    net.step(learning_rate)\n",
    "\n",
    "    # draw the current decision boundary every 250 examples seen\n",
    "    if it % 250 == 0 : \n",
    "        plot_decision_boundary(ax, X,Y, net)\n",
    "        fig.canvas.draw()\n",
    "plot_decision_boundary(ax, X,Y, net)\n",
    "fig.canvas.draw()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "33c3b709",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f94510bcee0>]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGdCAYAAABO2DpVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+RUlEQVR4nO3deXxU5aH/8W/YAigJriAKLrVKBbS4IdXe+qu01HK9andLvajd9GKvXu61luvaVhvqdq0V0brhhihWcEMQ2dcAgUBC2ENICISEJfueeX5/IDEJmcycmXPmLPm8X6+8XjBz5pxnzsyc8z3PeZYkY4wRAACADbq4XQAAABAcBAsAAGAbggUAALANwQIAANiGYAEAAGxDsAAAALYhWAAAANsQLAAAgG26JXqDoVBIe/fuVZ8+fZSUlJTozQMAgBgYY1RRUaEBAwaoS5fw9RIJDxZ79+7VwIEDE71ZAABgg4KCAp1xxhlhn094sOjTp4+kIwVLSUlJ9OYBAEAMysvLNXDgwObzeDgJDxZHb3+kpKQQLAAA8JlIzRhovAkAAGxDsAAAALYhWAAAANsQLAAAgG0IFgAAwDYECwAAYBuCBQAAsA3BAgAA2IZgAQAAbEOwAAAAtiFYAAAA2xAsAACAbQITLHYUV+jFJbmqbWhyuygAAHRaCZ/d1CmjnloiSaqobdCE757vcmkAAOicAlNjcdT6glK3iwAAQKcVuGABAADcQ7AAAAC2IVgAAADbECwAAIBtCBYAAMA2BAsAAGAbggUAALANwQIAANiGYAEAAGxDsAAAALYhWAAAANsQLAAAgG0IFgAAwDYECwAAYBuCBQAAsA3BAgAA2IZgAQAAbEOwAAAAtglcsDDG7RIAANB5BS5YAAAA9xAsAACAbQgWAADANgQLAABgG4IFAACwDcECAADYhmABAABsQ7AAAAC2IVgAAADbECwAAIBtCBYAAMA2BAsAAGAbggUAALANwQIAANjGUrB4+OGHlZSU1Opv8ODBTpUNAAD4TDerLxgyZIg+//zzL1fQzfIqAABAQFlOBd26dVP//v2dKAsAAPA5y20stm/frgEDBuicc87R2LFjlZ+f3+HydXV1Ki8vb/UHAACCyVKwGDFihKZOnao5c+ZoypQp2rVrl775zW+qoqIi7GvS0tKUmpra/Ddw4MC4Cw0AALwpyRhjYn1xaWmpzjzzTD311FP65S9/2e4ydXV1qqura/5/eXm5Bg4cqLKyMqWkpMS66WOc9YdPJElXnnuS3vrVFbatFwAAHDl/p6amRjx/x9Xysm/fvjrvvPO0Y8eOsMskJycrOTk5ns0AAACfiGsci8rKSu3cuVOnnXaaXeUBAAA+ZilY/M///I8WL16svLw8rVixQjfeeKO6du2qm266yanyAQAAH7F0K2TPnj266aabdPDgQZ1yyim66qqrtGrVKp1yyilOlQ8AAPiIpWAxffp0p8oBAAACgLlCAACAbQgWAADANgQLAABgG4IFAACwTeCCRezjiAIAgHgFLlgAAAD3ECwAAIBtCBYAAMA2BAsAAGAbggUAALANwQIAANiGYAEAAGxDsAAAALYJXLBggCwAANwTuGABAADcQ7AAAAC2CVywSEpyuwQAAHRegQsWAADAPQQLAABgG4IFAACwDcECAADYhmABAABsQ7AAAAC2CVywYORNAADcE7hgAQAA3EOwAAAAtiFYAAAA2xAsAACAbQgWAADANgQLAABgG4IFAACwDcECAADYhmABAABsE7hgYcTQmwAAuCVwwQIAALiHYAEAAGxDsAAAALYhWAAAANsQLAAAgG0IFgAAwDYECwAAYBuCBQAAsA3BAgAA2CZwwcIw8CYAAK4JXLAAAADuIVgAAADbBC5YJCW5XQIAADqvwAULAADgnriCxaRJk5SUlKS7777bpuIAAAA/izlYrFmzRi+88IIuvPBCO8sDAAB8LKZgUVlZqbFjx+rFF1/UCSecYHeZAACAT8UULMaPH68xY8Zo1KhREZetq6tTeXl5qz8AABBM3ay+YPr06Vq3bp3WrFkT1fJpaWn64x//aLlgAADAfyzVWBQUFOiuu+7SW2+9pZ49e0b1mokTJ6qsrKz5r6CgIKaCRouRNwEAcI+lGouMjAwVFxfr4osvbn6sqalJS5Ys0bPPPqu6ujp17dq11WuSk5OVnJxsT2kBAICnWQoW11xzjbKyslo9duutt2rw4MG69957jwkVAACgc7EULPr06aOhQ4e2euy4447TSSeddMzjAACg82HkTQAAYBvLvULaWrRokQ3FAAAAQUCNBQAAsA3BAgAA2IZgAQAAbEOwAAAAtglcsGDgTQAA3BO4YAEAANxDsAAAALYhWAAAANsQLAAAgG0IFgAAwDYECwAAYBuCBQAA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ffro1FNP1Q033KCtW7e2Wqa2tlbjx4/XSSedpOOPP14//OEPtX///lbL5Ofna8yYMerdu7dOPfVU3XPPPWpsbGy1zKJFi3TxxRcrOTlZ5557rqZOner02/OsSZMmKSkpSXfffXfzY+xnexQWFuoXv/iFTjrpJPXq1UvDhg3T2rVrm583xujBBx/Uaaedpl69emnUqFHavn17q3UcOnRIY8eOVUpKivr27atf/vKXqqysbLXMxo0b9c1vflM9e/bUwIED9dhjjyXk/XlBU1OTHnjgAZ199tnq1auXvvKVr+jPf/5zq3kj2M+xWbJkia677joNGDBASUlJmjVrVqvnE7lfZ8yYocGDB6tnz54aNmyYZs+ebf0NmQCYPn266dGjh3nllVfMpk2bzK9//WvTt29fs3//freL5kmjR482r776qsnOzjaZmZnm+9//vhk0aJCprKxsXub22283AwcONPPnzzdr1641V1xxhfnGN77R/HxjY6MZOnSoGTVqlFm/fr2ZPXu2Ofnkk83EiRObl8nNzTW9e/c2EyZMMDk5Oebvf/+76dq1q5kzZ05C368XrF692px11lnmwgsvNHfddVfz4+zn+B06dMiceeaZ5pZbbjHp6ekmNzfXzJ071+zYsaN5mUmTJpnU1FQza9Yss2HDBvNv//Zv5uyzzzY1NTXNy3zve98zF110kVm1apVZunSpOffcc81NN93U/HxZWZnp16+fGTt2rMnOzjZvv/226dWrl3nhhRcS+n7d8uijj5qTTjrJfPzxx2bXrl1mxowZ5vjjjzd/+9vfmpdhP8dm9uzZ5r777jPvv/++kWRmzpzZ6vlE7dfly5ebrl27mscee8zk5OSY+++/33Tv3t1kZWVZej+BCBaXX365GT9+fPP/m5qazIABA0xaWpqLpfKP4uJiI8ksXrzYGGNMaWmp6d69u5kxY0bzMps3bzaSzMqVK40xR34IXbp0MUVFRc3LTJkyxaSkpJi6ujpjjDG///3vzZAhQ1pt66c//akZPXq002/JUyoqKsxXv/pVM2/ePPOtb32rOViwn+1x7733mquuuirs86FQyPTv3988/vjjzY+Vlpaa5ORk8/bbbxtjjMnJyTGSzJo1a5qX+fTTT01SUpIpLCw0xhjz3HPPmRNOOKF5vx/d9vnnn2/3W/KkMWPGmNtuu63VYz/4wQ/M2LFjjTHsZ7u0DRaJ3K8/+clPzJgxY1qVZ8SIEea3v/2tpffg+1sh9fX1ysjI0KhRo5of69Kli0aNGqWVK1e6WDL/KCsrkySdeOKJkqSMjAw1NDS02qeDBw/WoEGDmvfpypUrNWzYMPXr1695mdGjR6u8vFybNm1qXqblOo4u09k+l/Hjx2vMmDHH7Av2sz0+/PBDXXrppfrxj3+sU089VcOHD9eLL77Y/PyuXbtUVFTUah+lpqZqxIgRrfZz3759demllzYvM2rUKHXp0kXp6enNy/zLv/yLevTo0bzM6NGjtXXrVh0+fNjpt+m6b3zjG5o/f762bdsmSdqwYYOWLVuma6+9VhL72SmJ3K92HUt8HywOHDigpqamVgdeSerXr5+KiopcKpV/hEIh3X333bryyis1dOhQSVJRUZF69Oihvn37tlq25T4tKipqd58ffa6jZcrLy1VTU+PE2/Gc6dOna926dUpLSzvmOfazPXJzczVlyhR99atf1dy5c3XHHXfoP//zP/Xaa69J+nI/dXSMKCoq0qmnntrq+W7duunEE0+09FkE2R/+8Af97Gc/0+DBg9W9e3cNHz5cd999t8aOHSuJ/eyURO7XcMtY3e8Jn90U3jJ+/HhlZ2dr2bJlbhclcAoKCnTXXXdp3rx56tmzp9vFCaxQKKRLL71Uf/nLXyRJw4cPV3Z2tp5//nmNGzfO5dIFx7vvvqu33npL06ZN05AhQ5SZmam7775bAwYMYD+jFd/XWJx88snq2rXrMS3p9+/fr/79+7tUKn+488479fHHH2vhwoWtprLv37+/6uvrVVpa2mr5lvu0f//+7e7zo891tExKSop69epl99vxnIyMDBUXF+viiy9Wt27d1K1bNy1evFjPPPOMunXrpn79+rGfbXDaaafpggsuaPXY1772NeXn50v6cj91dIzo37+/iouLWz3f2NioQ4cOWfosguyee+5prrUYNmyYbr75Zv3Xf/1Xc20c+9kZidyv4Zaxut99Hyx69OihSy65RPPnz29+LBQKaf78+Ro5cqSLJfMuY4zuvPNOzZw5UwsWLNDZZ5/d6vlLLrlE3bt3b7VPt27dqvz8/OZ9OnLkSGVlZbX6Ms+bN08pKSnNB/mRI0e2WsfRZTrL53LNNdcoKytLmZmZzX+XXnqpxo4d2/xv9nP8rrzyymO6S2/btk1nnnmmJOnss89W//79W+2j8vJypaent9rPpaWlysjIaF5mwYIFCoVCGjFiRPMyS5YsUUNDQ/My8+bN0/nnn68TTjjBsffnFdXV1erSpfUpo2vXrgqFQpLYz05J5H617VhiqamnR02fPt0kJyebqVOnmpycHPOb3/zG9O3bt1VLenzpjjvuMKmpqWbRokVm3759zX/V1dXNy9x+++1m0KBBZsGCBWbt2rVm5MiRZuTIkc3PH+0G+d3vftdkZmaaOXPmmFNOOaXdbpD33HOP2bx5s5k8eXKn6gbZnpa9QoxhP9th9erVplu3bubRRx8127dvN2+99Zbp3bu3efPNN5uXmTRpkunbt6/54IMPzMaNG83111/fbne94cOHm/T0dLNs2TLz1a9+tVV3vdLSUtOvXz9z8803m+zsbDN9+nTTu3fvQHeDbGncuHHm9NNPb+5u+v7775uTTz7Z/P73v29ehv0cm4qKCrN+/Xqzfv16I8k89dRTZv369Wb37t3GmMTt1+XLl5tu3bqZJ554wmzevNk89NBDnbe7qTHG/P3vfzeDBg0yPXr0MJdffrlZtWqV20XyLEnt/r366qvNy9TU1Jj/+I//MCeccILp3bu3ufHGG82+fftarScvL89ce+21plevXubkk082//3f/20aGhpaLbNw4ULz9a9/3fTo0cOcc845rbbRGbUNFuxne3z00Udm6NChJjk52QwePNj84x//aPV8KBQyDzzwgOnXr59JTk4211xzjdm6dWurZQ4ePGhuuukmc/zxx5uUlBRz6623moqKilbLbNiwwVx11VUmOTnZnH766WbSpEmOvzevKC8vN3fddZcZNGiQ6dmzpznnnHPMfffd16r7Ivs5NgsXLmz3mDxu3DhjTGL367vvvmvOO+8806NHDzNkyBDzySefWH4/TJsOAABs4/s2FgAAwDsIFgAAwDYECwAAYBuCBQAAsA3BAgAA2IZgAQAAbEOwAAAAtiFYAAAA2xAsAACAbQgWAADANgQLAABgG4IFAACwzf8HQa++UWi9a5UAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "plt.plot(losses)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9056ec69",
   "metadata": {},
   "source": [
    "## 3. Using a Pytorch module\n",
    "\n",
    "In this last part, use `toch.nn.Module` to recode `MyLinear` and `MyReLU` so that these modules will be pytorch compatible."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7cd895de",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "\n",
    "# y = xW + b\n",
    "class MyLinear_mod(nn.Module):\n",
    "    def __init__(self, n_input, n_output):\n",
    "        super(MyLinear_mod, self).__init__()\n",
    "        # define self.A and self.b the weights and biases\n",
    "        # initialize them with a normal distribution\n",
    "        # use nn.Parameters\n",
    "        self.A = nn.Parameter(torch.randn(n_input, n_output))\n",
    "        self.b = nn.Parameter(torch.randn(n_output))\n",
    "\n",
    "    def forward(self, x):\n",
    "        return torch.mm(x, self.A) + self.b\n",
    "        \n",
    "class MyReLU_mod(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(MyReLU_mod, self).__init__()\n",
    "        \n",
    "    def forward(self, x):\n",
    "        return x*(x > 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "63df73dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# the grid for plotting the decision boundary should be now made of tensors.\n",
    "to_forward = torch.from_numpy(np.array(list(zip(xx.ravel(), yy.ravel())))).float()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e595c06b",
   "metadata": {},
   "source": [
    "Define your network using `MyLinear_mod`, `MyReLU_mod` and [`nn.Sigmoid`](https://pytorch.org/docs/stable/nn.html#sigmoid)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "4cbd0d0d",
   "metadata": {},
   "outputs": [],
   "source": [
    "h=50\n",
    "\n",
    "# define your network with nn.Sequential\n",
    "# use MyLinear_mod, MyReLU_mod and nn.Sigmoid (from pytorch)\n",
    "net = nn.Sequential(\n",
    "    MyLinear_mod(2, h),\n",
    "    MyReLU_mod(),\n",
    "    MyLinear_mod(h, 1),\n",
    "    nn.Sigmoid()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "95a05b4a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "/* global mpl */\n",
       "window.mpl = {};\n",
       "\n",
       "mpl.get_websocket_type = function () {\n",
       "    if (typeof WebSocket !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof MozWebSocket !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert(\n",
       "            'Your browser does not have WebSocket support. ' +\n",
       "                'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "                'Firefox 4 and 5 are also supported but you ' +\n",
       "                'have to enable WebSockets in about:config.'\n",
       "        );\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = this.ws.binaryType !== undefined;\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById('mpl-warnings');\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent =\n",
       "                'This browser does not support binary websocket messages. ' +\n",
       "                'Performance may be slow.';\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = document.createElement('div');\n",
       "    this.root.setAttribute('style', 'display: inline-block');\n",
       "    this._root_extra_style(this.root);\n",
       "\n",
       "    parent_element.appendChild(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen = function () {\n",
       "        fig.send_message('supports_binary', { value: fig.supports_binary });\n",
       "        fig.send_message('send_image_mode', {});\n",
       "        if (fig.ratio !== 1) {\n",
       "            fig.send_message('set_device_pixel_ratio', {\n",
       "                device_pixel_ratio: fig.ratio,\n",
       "            });\n",
       "        }\n",
       "        fig.send_message('refresh', {});\n",
       "    };\n",
       "\n",
       "    this.imageObj.onload = function () {\n",
       "        if (fig.image_mode === 'full') {\n",
       "            // Full images could contain transparency (where diff images\n",
       "            // almost always do), so we need to clear the canvas so that\n",
       "            // there is no ghosting.\n",
       "            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "        }\n",
       "        fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "    };\n",
       "\n",
       "    this.imageObj.onunload = function () {\n",
       "        fig.ws.close();\n",
       "    };\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_header = function () {\n",
       "    var titlebar = document.createElement('div');\n",
       "    titlebar.classList =\n",
       "        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
       "    var titletext = document.createElement('div');\n",
       "    titletext.classList = 'ui-dialog-title';\n",
       "    titletext.setAttribute(\n",
       "        'style',\n",
       "        'width: 100%; text-align: center; padding: 3px;'\n",
       "    );\n",
       "    titlebar.appendChild(titletext);\n",
       "    this.root.appendChild(titlebar);\n",
       "    this.header = titletext;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = (this.canvas_div = document.createElement('div'));\n",
       "    canvas_div.setAttribute('tabindex', '0');\n",
       "    canvas_div.setAttribute(\n",
       "        'style',\n",
       "        'border: 1px solid #ddd;' +\n",
       "            'box-sizing: content-box;' +\n",
       "            'clear: both;' +\n",
       "            'min-height: 1px;' +\n",
       "            'min-width: 1px;' +\n",
       "            'outline: 0;' +\n",
       "            'overflow: hidden;' +\n",
       "            'position: relative;' +\n",
       "            'resize: both;' +\n",
       "            'z-index: 2;'\n",
       "    );\n",
       "\n",
       "    function on_keyboard_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.key_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'keydown',\n",
       "        on_keyboard_event_closure('key_press')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'keyup',\n",
       "        on_keyboard_event_closure('key_release')\n",
       "    );\n",
       "\n",
       "    this._canvas_extra_style(canvas_div);\n",
       "    this.root.appendChild(canvas_div);\n",
       "\n",
       "    var canvas = (this.canvas = document.createElement('canvas'));\n",
       "    canvas.classList.add('mpl-canvas');\n",
       "    canvas.setAttribute(\n",
       "        'style',\n",
       "        'box-sizing: content-box;' +\n",
       "            'pointer-events: none;' +\n",
       "            'position: relative;' +\n",
       "            'z-index: 0;'\n",
       "    );\n",
       "\n",
       "    this.context = canvas.getContext('2d');\n",
       "\n",
       "    var backingStore =\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        this.context.webkitBackingStorePixelRatio ||\n",
       "        this.context.mozBackingStorePixelRatio ||\n",
       "        this.context.msBackingStorePixelRatio ||\n",
       "        this.context.oBackingStorePixelRatio ||\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        1;\n",
       "\n",
       "    this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
       "        'canvas'\n",
       "    ));\n",
       "    rubberband_canvas.setAttribute(\n",
       "        'style',\n",
       "        'box-sizing: content-box;' +\n",
       "            'left: 0;' +\n",
       "            'pointer-events: none;' +\n",
       "            'position: absolute;' +\n",
       "            'top: 0;' +\n",
       "            'z-index: 1;'\n",
       "    );\n",
       "\n",
       "    // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
       "    if (this.ResizeObserver === undefined) {\n",
       "        if (window.ResizeObserver !== undefined) {\n",
       "            this.ResizeObserver = window.ResizeObserver;\n",
       "        } else {\n",
       "            var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
       "            this.ResizeObserver = obs.ResizeObserver;\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
       "        var nentries = entries.length;\n",
       "        for (var i = 0; i < nentries; i++) {\n",
       "            var entry = entries[i];\n",
       "            var width, height;\n",
       "            if (entry.contentBoxSize) {\n",
       "                if (entry.contentBoxSize instanceof Array) {\n",
       "                    // Chrome 84 implements new version of spec.\n",
       "                    width = entry.contentBoxSize[0].inlineSize;\n",
       "                    height = entry.contentBoxSize[0].blockSize;\n",
       "                } else {\n",
       "                    // Firefox implements old version of spec.\n",
       "                    width = entry.contentBoxSize.inlineSize;\n",
       "                    height = entry.contentBoxSize.blockSize;\n",
       "                }\n",
       "            } else {\n",
       "                // Chrome <84 implements even older version of spec.\n",
       "                width = entry.contentRect.width;\n",
       "                height = entry.contentRect.height;\n",
       "            }\n",
       "\n",
       "            // Keep the size of the canvas and rubber band canvas in sync with\n",
       "            // the canvas container.\n",
       "            if (entry.devicePixelContentBoxSize) {\n",
       "                // Chrome 84 implements new version of spec.\n",
       "                canvas.setAttribute(\n",
       "                    'width',\n",
       "                    entry.devicePixelContentBoxSize[0].inlineSize\n",
       "                );\n",
       "                canvas.setAttribute(\n",
       "                    'height',\n",
       "                    entry.devicePixelContentBoxSize[0].blockSize\n",
       "                );\n",
       "            } else {\n",
       "                canvas.setAttribute('width', width * fig.ratio);\n",
       "                canvas.setAttribute('height', height * fig.ratio);\n",
       "            }\n",
       "            /* This rescales the canvas back to display pixels, so that it\n",
       "             * appears correct on HiDPI screens. */\n",
       "            canvas.style.width = width + 'px';\n",
       "            canvas.style.height = height + 'px';\n",
       "\n",
       "            rubberband_canvas.setAttribute('width', width);\n",
       "            rubberband_canvas.setAttribute('height', height);\n",
       "\n",
       "            // And update the size in Python. We ignore the initial 0/0 size\n",
       "            // that occurs as the element is placed into the DOM, which should\n",
       "            // otherwise not happen due to the minimum size styling.\n",
       "            if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
       "                fig.request_resize(width, height);\n",
       "            }\n",
       "        }\n",
       "    });\n",
       "    this.resizeObserverInstance.observe(canvas_div);\n",
       "\n",
       "    function on_mouse_event_closure(name) {\n",
       "        /* User Agent sniffing is bad, but WebKit is busted:\n",
       "         * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
       "         * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
       "         * The worst that happens here is that they get an extra browser\n",
       "         * selection when dragging, if this check fails to catch them.\n",
       "         */\n",
       "        var UA = navigator.userAgent;\n",
       "        var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
       "        if(isWebKit) {\n",
       "            return function (event) {\n",
       "                /* This prevents the web browser from automatically changing to\n",
       "                 * the text insertion cursor when the button is pressed. We\n",
       "                 * want to control all of the cursor setting manually through\n",
       "                 * the 'cursor' event from matplotlib */\n",
       "                event.preventDefault()\n",
       "                return fig.mouse_event(event, name);\n",
       "            };\n",
       "        } else {\n",
       "            return function (event) {\n",
       "                return fig.mouse_event(event, name);\n",
       "            };\n",
       "        }\n",
       "    }\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'mousedown',\n",
       "        on_mouse_event_closure('button_press')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'mouseup',\n",
       "        on_mouse_event_closure('button_release')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'dblclick',\n",
       "        on_mouse_event_closure('dblclick')\n",
       "    );\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    canvas_div.addEventListener(\n",
       "        'mousemove',\n",
       "        on_mouse_event_closure('motion_notify')\n",
       "    );\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'mouseenter',\n",
       "        on_mouse_event_closure('figure_enter')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'mouseleave',\n",
       "        on_mouse_event_closure('figure_leave')\n",
       "    );\n",
       "\n",
       "    canvas_div.addEventListener('wheel', function (event) {\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        on_mouse_event_closure('scroll')(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.appendChild(canvas);\n",
       "    canvas_div.appendChild(rubberband_canvas);\n",
       "\n",
       "    this.rubberband_context = rubberband_canvas.getContext('2d');\n",
       "    this.rubberband_context.strokeStyle = '#000000';\n",
       "\n",
       "    this._resize_canvas = function (width, height, forward) {\n",
       "        if (forward) {\n",
       "            canvas_div.style.width = width + 'px';\n",
       "            canvas_div.style.height = height + 'px';\n",
       "        }\n",
       "    };\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    canvas_div.addEventListener('contextmenu', function (_e) {\n",
       "        event.preventDefault();\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus() {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'mpl-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'mpl-button-group';\n",
       "    for (var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'mpl-button-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        var button = (fig.buttons[name] = document.createElement('button'));\n",
       "        button.classList = 'mpl-widget';\n",
       "        button.setAttribute('role', 'button');\n",
       "        button.setAttribute('aria-disabled', 'false');\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "\n",
       "        var icon_img = document.createElement('img');\n",
       "        icon_img.src = '_images/' + image + '.png';\n",
       "        icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
       "        icon_img.alt = tooltip;\n",
       "        button.appendChild(icon_img);\n",
       "\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    var fmt_picker = document.createElement('select');\n",
       "    fmt_picker.classList = 'mpl-widget';\n",
       "    toolbar.appendChild(fmt_picker);\n",
       "    this.format_dropdown = fmt_picker;\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = document.createElement('option');\n",
       "        option.selected = fmt === mpl.default_extension;\n",
       "        option.innerHTML = fmt;\n",
       "        fmt_picker.appendChild(option);\n",
       "    }\n",
       "\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.send_message = function (type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function () {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1], msg['forward']);\n",
       "        fig.send_message('refresh', {});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
       "    var x0 = msg['x0'] / fig.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
       "    var x1 = msg['x1'] / fig.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0,\n",
       "        0,\n",
       "        fig.canvas.width / fig.ratio,\n",
       "        fig.canvas.height / fig.ratio\n",
       "    );\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
       "    fig.canvas_div.style.cursor = msg['cursor'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
       "    for (var key in msg) {\n",
       "        if (!(key in fig.buttons)) {\n",
       "            continue;\n",
       "        }\n",
       "        fig.buttons[key].disabled = !msg[key];\n",
       "        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
       "    if (msg['mode'] === 'PAN') {\n",
       "        fig.buttons['Pan'].classList.add('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    } else if (msg['mode'] === 'ZOOM') {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.add('active');\n",
       "    } else {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function () {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message('ack', {});\n",
       "};\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            var img = evt.data;\n",
       "            if (img.type !== 'image/png') {\n",
       "                /* FIXME: We get \"Resource interpreted as Image but\n",
       "                 * transferred with MIME type text/plain:\" errors on\n",
       "                 * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "                 * to be part of the websocket stream */\n",
       "                img.type = 'image/png';\n",
       "            }\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src\n",
       "                );\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                img\n",
       "            );\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        } else if (\n",
       "            typeof evt.data === 'string' &&\n",
       "            evt.data.slice(0, 21) === 'data:image/png;base64'\n",
       "        ) {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig['handle_' + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\n",
       "                \"No handler for the '\" + msg_type + \"' message type: \",\n",
       "                msg\n",
       "            );\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\n",
       "                    \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
       "                    e,\n",
       "                    e.stack,\n",
       "                    msg\n",
       "                );\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "};\n",
       "\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * https://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys(original) {\n",
       "    return Object.keys(original).reduce(function (obj, key) {\n",
       "        if (typeof original[key] !== 'object') {\n",
       "            obj[key] = original[key];\n",
       "        }\n",
       "        return obj;\n",
       "    }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function (event, name) {\n",
       "    if (name === 'button_press') {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    // from https://stackoverflow.com/q/1114465\n",
       "    var boundingRect = this.canvas.getBoundingClientRect();\n",
       "    var x = (event.clientX - boundingRect.left) * this.ratio;\n",
       "    var y = (event.clientY - boundingRect.top) * this.ratio;\n",
       "\n",
       "    this.send_message(name, {\n",
       "        x: x,\n",
       "        y: y,\n",
       "        button: event.button,\n",
       "        step: event.step,\n",
       "        guiEvent: simpleKeys(event),\n",
       "    });\n",
       "\n",
       "    return false;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.key_event = function (event, name) {\n",
       "    // Prevent repeat events\n",
       "    if (name === 'key_press') {\n",
       "        if (event.key === this._key) {\n",
       "            return;\n",
       "        } else {\n",
       "            this._key = event.key;\n",
       "        }\n",
       "    }\n",
       "    if (name === 'key_release') {\n",
       "        this._key = null;\n",
       "    }\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.key !== 'Control') {\n",
       "        value += 'ctrl+';\n",
       "    }\n",
       "    else if (event.altKey && event.key !== 'Alt') {\n",
       "        value += 'alt+';\n",
       "    }\n",
       "    else if (event.shiftKey && event.key !== 'Shift') {\n",
       "        value += 'shift+';\n",
       "    }\n",
       "\n",
       "    value += 'k' + event.key;\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
       "    return false;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
       "    if (name === 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message('toolbar_button', { name: name });\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "\n",
       "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
       "// prettier-ignore\n",
       "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
       "\n",
       "mpl.default_extension = \"png\";/* global mpl */\n",
       "\n",
       "var comm_websocket_adapter = function (comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.binaryType = comm.kernel.ws.binaryType;\n",
       "    ws.readyState = comm.kernel.ws.readyState;\n",
       "    function updateReadyState(_event) {\n",
       "        if (comm.kernel.ws) {\n",
       "            ws.readyState = comm.kernel.ws.readyState;\n",
       "        } else {\n",
       "            ws.readyState = 3; // Closed state.\n",
       "        }\n",
       "    }\n",
       "    comm.kernel.ws.addEventListener('open', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('close', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('error', updateReadyState);\n",
       "\n",
       "    ws.close = function () {\n",
       "        comm.close();\n",
       "    };\n",
       "    ws.send = function (m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function (msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        var data = msg['content']['data'];\n",
       "        if (data['blob'] !== undefined) {\n",
       "            data = {\n",
       "                data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
       "            };\n",
       "        }\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(data);\n",
       "    });\n",
       "    return ws;\n",
       "};\n",
       "\n",
       "mpl.mpl_figure_comm = function (comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = document.getElementById(id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm);\n",
       "\n",
       "    function ondownload(figure, _format) {\n",
       "        window.open(figure.canvas.toDataURL());\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element;\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error('Failed to find cell for figure', id, fig);\n",
       "        return;\n",
       "    }\n",
       "    fig.cell_info[0].output_area.element.on(\n",
       "        'cleared',\n",
       "        { fig: fig },\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
       "    var width = fig.canvas.width / fig.ratio;\n",
       "    fig.cell_info[0].output_area.element.off(\n",
       "        'cleared',\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "    fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable();\n",
       "    fig.parent_element.innerHTML =\n",
       "        '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "    fig.close_ws(fig, msg);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width / this.ratio;\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] =\n",
       "        '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function () {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message('ack', {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () {\n",
       "        fig.push_to_output();\n",
       "    }, 1000);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'btn-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'btn-group';\n",
       "    var button;\n",
       "    for (var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'btn-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        button = fig.buttons[name] = document.createElement('button');\n",
       "        button.classList = 'btn btn-default';\n",
       "        button.href = '#';\n",
       "        button.title = name;\n",
       "        button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message pull-right';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = document.createElement('div');\n",
       "    buttongrp.classList = 'btn-group inline pull-right';\n",
       "    button = document.createElement('button');\n",
       "    button.classList = 'btn btn-mini btn-primary';\n",
       "    button.href = '#';\n",
       "    button.title = 'Stop Interaction';\n",
       "    button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
       "    button.addEventListener('click', function (_evt) {\n",
       "        fig.handle_close(fig, {});\n",
       "    });\n",
       "    button.addEventListener(\n",
       "        'mouseover',\n",
       "        on_mouseover_closure('Stop Interaction')\n",
       "    );\n",
       "    buttongrp.appendChild(button);\n",
       "    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
       "    titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
       "    var fig = event.data.fig;\n",
       "    if (event.target !== this) {\n",
       "        // Ignore bubbled events from children.\n",
       "        return;\n",
       "    }\n",
       "    fig.close_ws(fig, {});\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (el) {\n",
       "    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
       "    // this is important to make the div 'focusable\n",
       "    el.setAttribute('tabindex', 0);\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    } else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which === 13) {\n",
       "        this.canvas_div.blur();\n",
       "        // select the cell after this one\n",
       "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
       "        IPython.notebook.select(index + 1);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "};\n",
       "\n",
       "mpl.find_output_cell = function (html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i = 0; i < ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code') {\n",
       "            for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] === html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "};\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel !== null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target(\n",
       "        'matplotlib',\n",
       "        mpl.mpl_figure_comm\n",
       "    );\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"639.9999861283738\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from torch import optim\n",
    "optimizer = optim.SGD(net.parameters(), lr=1e-2)\n",
    "\n",
    "X_torch = torch.from_numpy(X).float()\n",
    "Y_torch = torch.from_numpy(Y).float()\n",
    "\n",
    "# you should comment the following line if on colab\n",
    "%matplotlib notebook\n",
    "fig, ax = plt.subplots(1, 1, facecolor='#4B6EA9')\n",
    "ax.set_xlim(x_min, x_max)\n",
    "ax.set_ylim(y_min, y_max)\n",
    "\n",
    "losses = []\n",
    "criterion = nn.BCELoss()\n",
    "for it in range(10000):\n",
    "    # pick a random example id \n",
    "    j = np.random.randint(1, len(X))\n",
    "\n",
    "    # select the corresponding example and label\n",
    "    example = X_torch[j:j+1]\n",
    "    label = Y_torch[j:j+1].unsqueeze(1)\n",
    "\n",
    "    # do a forward pass on the example\n",
    "    output = net(example)\n",
    "\n",
    "    # compute the loss according to your output and the label\n",
    "    loss = criterion(output, label)\n",
    "    losses.append(loss.item())\n",
    "\n",
    "    # zero the gradients\n",
    "    optimizer.zero_grad()\n",
    "\n",
    "    # backward pass\n",
    "    loss.backward()\n",
    "\n",
    "    # gradient step\n",
    "    optimizer.step()\n",
    "\n",
    "    # draw the current decision boundary every 250 examples seen\n",
    "    if it % 250 == 0 : \n",
    "        plot_decision_boundary(ax, X,Y, net)\n",
    "        fig.canvas.draw()\n",
    "plot_decision_boundary(ax, X,Y, net)\n",
    "fig.canvas.draw()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "9de296f5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f9451087820>]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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ub4ejyoMOAUAAJYifAAAAEs5KnzExsZq1KhRio2NtbspZzWOszU4ztbgOFuHY22NaDjOUTfgFAAAnN0c1fMBAADsR/gAAACWInwAAABLET4AAIClHBM+xo8fr4suukgtW7ZUr169tHbtWrubFNVGjx6tG2+8UW3btlXHjh11//33KzMz02ufkpISDRkyROeee67atGmjgQMHKi8vz2uf7OxsDRgwQK1bt1bHjh313HPPqaKiwmufJUuW6Ic//KFiY2N1ySWXaPLkyZF+e1FpzJgxiomJ0dChQz33cYzD58CBA/rVr36lc889V61atVKPHj2Umprq2W6M0ciRI9WpUye1atVKffr0UVZWltdzHDt2TIMGDVJcXJzatWunxx57TEVFRV77bNq0SbfffrtatmyppKQkvfbaa5a8v2hQWVmpF198UV27dlWrVq108cUX6+WXX/Za64PjHLxly5bp3nvvVefOnRUTE6NZs2Z5bbfymM6YMUPdu3dXy5Yt1aNHD82dOze0N2UcYNq0aaZFixbmX//6l9myZYv57W9/a9q1a2fy8vLsblrU6tu3r5k0aZLJyMgw6enp5p577jFdunQxRUVFnn2eeOIJk5SUZJKTk01qaqq5+eabzS233OLZXlFRYa6++mrTp08fs2HDBjN37lzToUMHM2LECM8+u3btMq1btzbDhg0zW7duNePGjTNNmzY18+bNs/T92m3t2rXmoosuMtdcc4155plnPPdzjMPj2LFj5sILLzSPPPKIWbNmjdm1a5eZP3++2bFjh2efMWPGmPj4eDNr1iyzceNG89Of/tR07drVnDx50rNPv379zLXXXmtWr15tli9fbi655BLz0EMPebYXFBSYhIQEM2jQIJORkWE+/fRT06pVK/Pee+9Z+n7t8uqrr5pzzz3XzJ492+zevdvMmDHDtGnTxrz99tuefTjOwZs7d6554YUXzJdffmkkmZkzZ3ptt+qYrly50jRt2tS89tprZuvWreZPf/qTad68udm8eXPQ78kR4eOmm24yQ4YM8fxcWVlpOnfubEaPHm1jqxqXQ4cOGUlm6dKlxhhj8vPzTfPmzc2MGTM8+2zbts1IMikpKcaYU/9hmjRpYnJzcz37TJgwwcTFxZnS0lJjjDHDhw83V111lddrPfDAA6Zv376RfktRo7Cw0Fx66aVmwYIF5kc/+pEnfHCMw+ePf/yjue222+rc7na7TWJionn99dc99+Xn55vY2Fjz6aefGmOM2bp1q5Fk1q1b59nn22+/NTExMebAgQPGGGPeffddc84553iOfdVrX3755eF+S1FpwIAB5te//rXXfT//+c/NoEGDjDEc53CoGT6sPKa//OUvzYABA7za06tXL/O73/0u6Pdx1l92KSsrU1pamvr06eO5r0mTJurTp49SUlJsbFnjUlBQIElq3769JCktLU3l5eVex7V79+7q0qWL57impKSoR48eSkhI8OzTt29fuVwubdmyxbNP9eeo2sdJv5shQ4ZowIABtY4Dxzh8vv76a/Xs2VO/+MUv1LFjR11//fX65z//6dm+e/du5ebmeh2n+Ph49erVy+tYt2vXTj179vTs06dPHzVp0kRr1qzx7HPHHXeoRYsWnn369u2rzMxMHT9+PNJv03a33HKLkpOTtX37dknSxo0btWLFCvXv318SxzkSrDym4fwsOevDx5EjR1RZWen14SxJCQkJys3NtalVjYvb7dbQoUN166236uqrr5Yk5ebmqkWLFmrXrp3XvtWPa25urs/jXrXN3z4ul0snT56MxNuJKtOmTdP69es1evToWts4xuGza9cuTZgwQZdeeqnmz5+vJ598Uv/zP/+jjz76SNKZY+XvcyI3N1cdO3b02t6sWTO1b98+qN/H2ez555/Xgw8+qO7du6t58+a6/vrrNXToUA0aNEgSxzkSrDymde0TyjGPulVtEX2GDBmijIwMrVixwu6mnFX27dunZ555RgsWLFDLli3tbs5Zze12q2fPnvrrX/8qSbr++uuVkZGhiRMnavDgwTa37uwxffp0TZkyRVOnTtVVV12l9PR0DR06VJ07d+Y4w8tZ3/PRoUMHNW3atNYMgby8PCUmJtrUqsbjqaee0uzZs7V48WJdcMEFnvsTExNVVlam/Px8r/2rH9fExESfx71qm7994uLi1KpVq3C/naiSlpamQ4cO6Yc//KGaNWumZs2aaenSpRo7dqyaNWumhIQEjnGYdOrUSVdeeaXXfVdccYWys7MlnTlW/j4nEhMTdejQIa/tFRUVOnbsWFC/j7PZc8895+n96NGjhx5++GE9++yznp49jnP4WXlM69onlGN+1oePFi1a6IYbblBycrLnPrfbreTkZPXu3dvGlkU3Y4yeeuopzZw5U4sWLVLXrl29tt9www1q3ry513HNzMxUdna257j27t1bmzdv9vqjX7BggeLi4jwngt69e3s9R9U+Tvjd3HXXXdq8ebPS09M9t549e2rQoEGef3OMw+PWW2+tNVV8+/btuvDCCyVJXbt2VWJiotdxcrlcWrNmjdexzs/PV1pammefRYsWye12q1evXp59li1bpvLycs8+CxYs0OWXX65zzjknYu8vWpw4cUJNmnifVpo2bSq32y2J4xwJVh7TsH6WBD1EtRGaNm2aiY2NNZMnTzZbt241jz/+uGnXrp3XDAF4e/LJJ018fLxZsmSJOXjwoOd24sQJzz5PPPGE6dKli1m0aJFJTU01vXv3Nr179/Zsr5oGevfdd5v09HQzb948c9555/mcBvrcc8+Zbdu2mfHjxztuGmh11We7GMMxDpe1a9eaZs2amVdffdVkZWWZKVOmmNatW5tPPvnEs8+YMWNMu3btzFdffWU2bdpk7rvvPp/TFa+//nqzZs0as2LFCnPppZd6TVfMz883CQkJ5uGHHzYZGRlm2rRppnXr1mftFNCaBg8ebM4//3zPVNsvv/zSdOjQwQwfPtyzD8c5eIWFhWbDhg1mw4YNRpJ54403zIYNG8zevXuNMdYd05UrV5pmzZqZv//972bbtm1m1KhRTLWtz7hx40yXLl1MixYtzE033WRWr15td5OimiSft0mTJnn2OXnypPn9739vzjnnHNO6dWvzs5/9zBw8eNDrefbs2WP69+9vWrVqZTp06GD+93//15SXl3vts3jxYnPdddeZFi1amG7dunm9htPUDB8c4/D55ptvzNVXX21iY2NN9+7dzfvvv++13e12mxdffNEkJCSY2NhYc9ddd5nMzEyvfY4ePWoeeugh06ZNGxMXF2ceffRRU1hY6LXPxo0bzW233WZiY2PN+eefb8aMGRPx9xYtXC6XeeaZZ0yXLl1My5YtTbdu3cwLL7zgNX2T4xy8xYsX+/w8Hjx4sDHG2mM6ffp0c9lll5kWLVqYq666ysyZMyek9xRjTLXScwAAABF21o/5AAAA0YXwAQAALEX4AAAAliJ8AAAASxE+AACApQgfAADAUoQPAABgKcIHAACwFOEDAABYivABAAAsRfgAAACWInwAAABL/X+omh2LC1giVgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "plt.plot(losses)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0d445241",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "dldiy",
   "language": "python",
   "name": "dldiy"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
